<?php
namespace app\http; 
 
use GatewayWorker\Lib\Gateway;
use Workerman\Worker;
use think\worker\Application; // 特别注意：下方用到的Application属于think\work命名空间下的类，由于命名空间的更换，需要这样引入才能使用，否则会报错找不到这个类。
 
/**
 * Worker 命令行服务类
 */
class Events
{
    /**
     * onWorkerStart 事件回调
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
     *
     * @access public
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStart(Worker $businessWorker)    
    {
        $app = new Application;
        $app->initialize();
    }
 
    /**
     * onConnect 事件回调
     * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
     *
     * @access public
     * @param  int       $client_id
     * @return void
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToCurrentClient("Your client_id is $client_id");
    }
 
    /**
     * onWebSocketConnect 事件回调
     * 当客户端连接上gateway完成websocket握手时触发
     *
     * @param  integer  $client_id 断开连接的客户端client_id
     * @param  mixed    $data
     * @return void
     */
    public static function onWebSocketConnect($client_id, $data)
    {
        var_export($data);
    }
 
    /**
     * onMessage 事件回调
     * 当客户端发来数据(Gateway进程收到数据)后触发
     *
     * @access public
     * @param  int       $client_id
     * @param  mixed     $data
     * @return void
     */
    public static function onMessage($client_id, $data)
    {
        // 获取发送过来的消息内容 解析
        $message_data = json_decode($data,true);
        file_put_contents('2020.txt', date('Y-m-d H:i:s').$data.PHP_EOL,FILE_APPEND);

        switch($message_data['type']) {
            case "bind":
                $fromId = $message_data['fromId'];
                // 设置GatewayWorker服务的Register服务ip和端口，请根据实际情况改成实际值(ip不能是0.0.0.0)
                Gateway::$registerAddress = '127.0.0.1:12360';
                // client_id与uid绑定
                Gateway::bindUid($client_id, $fromId);
                //Gateway::sendToCurrentClient("绑定成功");
                /**
                *调用存储用户的方法等等
                **/
                return;
            case "text":
                $toId = $message_data['toId'];
                //Gateway::sendToUid($toId, json_encode($data));
                //Gateway::sendToClient($toId, json_encode($data));
                Gateway::sendToUid($toId, $data);

            default :
                return ;
        }

        //Gateway::sendToAll($data);
    }
 
    /**
     * onClose 事件回调 当用户断开连接时触发的方法
     *
     * @param  integer $client_id 断开连接的客户端client_id
     * @return void
     */
    public static function onClose($client_id)
    {
        GateWay::sendToAll("client[$client_id] logout\n");
    }
 
    /**
     * onWorkerStop 事件回调
     * 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
     *
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStop(Worker $businessWorker)
    {
        echo "WorkerStop\n";
    }
}